package com.itheima.service;


import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.dubbo.config.annotation.Service;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.CheckGroupDao;
import com.itheima.dao.CheckItemDao;
import com.itheima.entity.PageResult;

import com.itheima.exception.CheckGroupException;
import com.itheima.pojo.CheckGroup;
import com.itheima.pojo.CheckItem;
import com.sun.javafx.collections.MappingChange;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.*;

/**
 * @author: libin
 * @date: 2019/11/20 21:09
 * @version: 1.0
 * @describe:
 */
@Service(interfaceClass =CheckGroupService.class )
@Transactional
public class CheckGroupServiceImpl implements CheckGroupService {

    @Autowired
    private CheckGroupDao checkGroupDao;

    @Autowired
    private CheckItemDao checkItemDao;

    /**
     * 分页查询检查组
     * @param currentPage
     * @param pageSize
     * @param queryString
     * @return
     */
    @Override
    public PageResult findAll(Integer currentPage, Integer pageSize, String queryString) {
        //使用分页查询工具类
       Page page = PageHelper.startPage(currentPage,pageSize);
        //普通sql
      List<CheckGroup> checkGroups = checkGroupDao.findAll(queryString);
      return new PageResult(page.getTotal(),checkGroups);
    }


    /**
     * 添加检查组
     * @param checkGroup
     */
    @Override
    public void add(CheckGroup checkGroup) {
        //t_checkgroup添加项目组，并返回主键
        checkGroupDao.add(checkGroup);
        Integer checkgroupId = checkGroup.getId();

        //t_checkgroup_checkitem添加检查组和检查项的关系（循环添加）
        List<Integer> checkitemIds = checkGroup.getCheckitemIds();
        //判断checkitemIds不能为空
        if (CollectionUtil.isNotEmpty(checkitemIds)) {
            List<Map> maps=new ArrayList<>();
            for (Integer checkitemId : checkitemIds) {
                Map map = new HashMap();
                map.put("checkgroup_id",checkgroupId);
                map.put("checkitem_id",checkitemId);
                maps.add(map);
            }
            checkGroupDao.setCheckGroupAndCheckItemBatch(maps);
        }

    }


    /**
     * 查询检查组的所有信息
     * @param id
     * @return
     */
    @Override
    public CheckGroup findById(Integer id) {
        //1.查询检查组的信息
        CheckGroup checkGroup=checkGroupDao.findById(id);
        //2.查询所有检查项的信息
        List<CheckItem> checkItems = checkItemDao.findAll();
        //3.查询勾选的检查项
        List<Integer> checkitemIds = checkGroupDao.findCheckItemIdsByCheckGroupId(id);

        checkGroup.setCheckItems(checkItems);
        checkGroup.setCheckitemIds(checkitemIds);
        return checkGroup;
    }

    /**
     * 编辑检查组
     * @param checkGroup
     */
    @Override
    public void edit(CheckGroup checkGroup) {
        //根据检查组的id删除中间表的关系
        checkGroupDao.deleteAssociation(checkGroup.getId());
        //更新检查组信息
        checkGroupDao.edit(checkGroup,checkGroup.getId());
        //更新中间表信息（循环遍历插入数据）
        List<Integer> checkitemIds = checkGroup.getCheckitemIds();
        if (CollectionUtil.isNotEmpty(checkitemIds)) {
            List<Map> maps=new ArrayList<>();
            for (Integer checkitemId : checkitemIds) {
                Map map=new HashMap();
                map.put("checkgroup_id",checkGroup.getId());
                map.put("checkitem_id",checkitemId);
                maps.add(map);
            }
            checkGroupDao.setCheckGroupAndCheckItem(maps);
        }


    }


    /**
     * 删除检查组
     * @param id
     */
    @Override
    public void delete(Integer id) throws CheckGroupException{
        long count =checkGroupDao.findCountByCheckGroupId(id);
        if (count>0) {
            //有检查组使用该id的检查项
            throw new CheckGroupException("存在引用，不可删除");
        } else {
            //删除中间表联系
            checkGroupDao.deleteAssociation(id);
            //删除
            checkGroupDao.delete(id);
        }
    }

    /**
     * 查询所有检查组
     * @return
     */
    @Override
    public List<CheckGroup> findAllCheckGroup() {
       return checkGroupDao.findAllCheckGroup();
    }
}
